package com.hsurosy.types.event;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @Author Hsu琛君珩
 * @Date 2024-11-09 19:48
 * @Description 基础事件
 * @Version: v1.0.0
 */
@Data
public abstract class BaseEvent<T> {

    /**
     * 构建事件消息，包含消息的唯一 ID、时间戳和数据
     *
     * @param data 事件的数据内容
     * @return 构建的事件消息对象
     */
    public abstract EventMessage<T> buildEventMessage(T data);

    /**
     * 获取事件的主题名称，用于消息发布的主题定义
     *
     * @return 事件的主题名称
     */
    public abstract String topic();

    /**
     * 事件消息内部类，封装了消息的 ID、时间戳和数据内容。
     *
     * @param <T> 消息数据类型
     */
    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class EventMessage<T> {
        private String id; // 消息唯一标识符
        private Date timestamp; // 消息的时间戳，表示事件触发的时间
        private T data; // 消息的数据内容
    }

}
